Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / Sideband.git / files / sbapp / services / sidebandservice.py

Displaying Raw • Download


sbapp/services/sidebandservice.py f4d148cbafff76fb2fc1a7a3d1cac02afaef17d3 (f4d148cb) Text, 19.17 KB

Te6edf3__debug_build__ Tff7b72= Tff7b72False

Tff7b72import T7ee787sys
Tff7b72import T7ee787time
Tff7b72import T7ee787RNS
Tff7b72from T7ee787os Tff7b72import Te6edf3environ

Tff7b72from T7ee787kivyT7ee787.T7ee787logger Tff7b72import Te6edf3LoggerTb4b4b4, Te6edf3LOG_LEVELS

Tff7b72if Te6edf3__debug_build__Tb4b4b4:
Te6edf3LoggerTff7b72.Td2a8ffsetLevelTb4b4b4(Te6edf3LOG_LEVELSTb4b4b4[Ta5d6ff"Ta5d6ffdebugTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3LoggerTff7b72.Td2a8ffsetLevelTb4b4b4(Te6edf3LOG_LEVELSTb4b4b4[Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4]Tb4b4b4)

Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffget_platformTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4:
Tff7b72from T7ee787jnius Tff7b72import Te6edf3autoclassTb4b4b4, Te6edf3cast

T8b949e# Squelch excessive method signature logging
Tff7b72import T7ee787jniusT7ee787.T7ee787reflect
Tff7b72class T56d364redirect_logTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffisEnabledForTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3argTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffdebugTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3argTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72def Td2a8ffmodTb4b4b4(Te6edf3methodTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3signatureTb4b4b4)Tb4b4b4:
Tff7b72pass
Te6edf3jniusTff7b72.Td2a8ffreflectTff7b72.Td2a8fflog_method Tff7b72= Te6edf3mod
Te6edf3jniusTff7b72.Td2a8ffreflectTff7b72.Td2a8fflog Tff7b72= Te6edf3redirect_logTb4b4b4(Tb4b4b4)
T8b949e############################################

Tff7b72from T7ee787android Tff7b72import Te6edf3python_act
Te6edf3android_api_version Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.os.Build$VERSIONTa5d6ff'Tb4b4b4)Tff7b72.Td2a8ffSDK_INT
Te6edf3Intent Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.content.IntentTa5d6ff'Tb4b4b4)
Te6edf3BitmapFactory Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.graphics.BitmapFactoryTa5d6ff'Tb4b4b4)
Te6edf3Icon Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.graphics.drawable.IconTa5d6ff"Tb4b4b4)
Te6edf3PendingIntent Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.app.PendingIntentTa5d6ff'Tb4b4b4)
Te6edf3AndroidString Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffjava.lang.StringTa5d6ff'Tb4b4b4)
Te6edf3NotificationManager Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.app.NotificationManagerTa5d6ff'Tb4b4b4)
Te6edf3Context Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.content.ContextTa5d6ff'Tb4b4b4)

Tff7b72if Te6edf3android_api_version Tff7b72>Tff7b72= T79c0ff26Tb4b4b4:
Te6edf3NotificationBuilder Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.app.Notification$BuilderTa5d6ff'Tb4b4b4)
Te6edf3NotificationChannel Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.app.NotificationChannelTa5d6ff'Tb4b4b4)

Tff7b72from T7ee787usb4a Tff7b72import Te6edf3usb
Tff7b72from T7ee787usbserial4a Tff7b72import Te6edf3serial4a
Tff7b72from T7ee787sidebandT7ee787.T7ee787core Tff7b72import Te6edf3SidebandCore

Tff7b72elseTb4b4b4:
Tff7b72from T7ee787sbappT7ee787.T7ee787sidebandT7ee787.T7ee787core Tff7b72import Te6edf3SidebandCore

Tff7b72class T56d364SidebandServiceTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3usb_device_filter Tff7b72= Tb4b4b4{
T79c0ff0x0403Tb4b4b4: Tb4b4b4[T79c0ff0x6001Tb4b4b4, T79c0ff0x6010Tb4b4b4, T79c0ff0x6011Tb4b4b4, T79c0ff0x6014Tb4b4b4, T79c0ff0x6015Tb4b4b4]Tb4b4b4, T8b949e# FTDI
T79c0ff0x10C4Tb4b4b4: Tb4b4b4[T79c0ff0xea60Tb4b4b4, T79c0ff0xea70Tb4b4b4, T79c0ff0xea71Tb4b4b4]Tb4b4b4, T8b949e# SiLabs
T79c0ff0x067BTb4b4b4: Tb4b4b4[T79c0ff0x2303Tb4b4b4, T79c0ff0x23a3Tb4b4b4, T79c0ff0x23b3Tb4b4b4, T79c0ff0x23c3Tb4b4b4, T79c0ff0x23d3Tb4b4b4, T79c0ff0x23e3Tb4b4b4, T79c0ff0x23f3Tb4b4b4]Tb4b4b4, T8b949e# Prolific
T79c0ff0x1a86Tb4b4b4: Tb4b4b4[T79c0ff0x5523Tb4b4b4, T79c0ff0x7523Tb4b4b4, T79c0ff0x55D4Tb4b4b4]Tb4b4b4, T8b949e# Qinheng
T79c0ff0x0483Tb4b4b4: Tb4b4b4[T79c0ff0x5740Tb4b4b4]Tb4b4b4, T8b949e# ST CDC
T79c0ff0x2E8ATb4b4b4: Tb4b4b4[T79c0ff0x0005Tb4b4b4, T79c0ff0x000ATb4b4b4]Tb4b4b4, T8b949e# Raspberry Pi Pico
T79c0ff0x239ATb4b4b4: Tb4b4b4[T79c0ff0x8029Tb4b4b4]Tb4b4b4, T8b949e# Adafruit (RAK4631)
T79c0ff0x303ATb4b4b4: Tb4b4b4[T79c0ff0x1001Tb4b4b4]Tb4b4b4, T8b949e# ESP-32S3
Tb4b4b4}
Tff7b72def Td2a8ffandroid_notificationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3titleTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4, Te6edf3contentTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4, Te6edf3tickerTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4, Te6edf3groupTff7b72=Tff7b72NoneTb4b4b4, Te6edf3context_idTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3android_api_version Tff7b72< T79c0ff26Tb4b4b4:
Tff7b72return
Tff7b72elseTb4b4b4:
Te6edf3package_name Tff7b72= Ta5d6ff"Ta5d6ffio.unsigned.sidebandTa5d6ff"

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffnotification_serviceTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnotification_service Tff7b72= Te6edf3castTb4b4b4(Te6edf3NotificationManagerTb4b4b4, Tff7b72selfTff7b72.Td2a8ffapp_contextTff7b72.Td2a8ffgetSystemServiceTb4b4b4(
Te6edf3ContextTff7b72.Td2a8ffNOTIFICATION_SERVICE
Tb4b4b4)Tb4b4b4)

Te6edf3channel_id Tff7b72= Te6edf3package_name
Te6edf3group_id Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3group Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3channel_id Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff.Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3groupTb4b4b4)
Te6edf3group_id Tff7b72+Tff7b72= Tffa657strTb4b4b4(Te6edf3groupTb4b4b4)
Tff7b72if Te6edf3context_id Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3channel_id Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff.Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3context_idTb4b4b4)
Te6edf3group_id Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff.Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3context_idTb4b4b4)

Tff7b72if Tff7b72not Te6edf3title Tff7b72or Te6edf3title Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Te6edf3channel_name Tff7b72= Ta5d6ff"Ta5d6ffSidebandTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3channel_name Tff7b72= Te6edf3title

Tff7b72selfTff7b72.Td2a8ffnotification_channel Tff7b72= Te6edf3NotificationChannelTb4b4b4(Te6edf3channel_idTb4b4b4, Te6edf3channel_nameTb4b4b4, Te6edf3NotificationManagerTff7b72.Td2a8ffIMPORTANCE_DEFAULTTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnotification_channelTff7b72.Td2a8ffenableVibrationTb4b4b4(Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnotification_channelTff7b72.Td2a8ffsetShowBadgeTb4b4b4(Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnotification_serviceTff7b72.Td2a8ffcreateNotificationChannelTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnotification_channelTb4b4b4)

Te6edf3notification Tff7b72= Te6edf3NotificationBuilderTb4b4b4(Tff7b72selfTff7b72.Td2a8ffapp_contextTb4b4b4, Te6edf3channel_idTb4b4b4)
Te6edf3notificationTff7b72.Td2a8ffsetContentTitleTb4b4b4(Te6edf3titleTb4b4b4)
Te6edf3notificationTff7b72.Td2a8ffsetContentTextTb4b4b4(Te6edf3AndroidStringTb4b4b4(Te6edf3contentTb4b4b4)Tb4b4b4)
T8b949e# if group != None:
T8b949e# notification.setGroup(group_id)

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffnotification_small_iconTb4b4b4:
Te6edf3path Tff7b72= Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffnotification_icon
Te6edf3bitmap Tff7b72= Te6edf3BitmapFactoryTff7b72.Td2a8ffdecodeFileTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnotification_small_icon Tff7b72= Te6edf3IconTff7b72.Td2a8ffcreateWithBitmapTb4b4b4(Te6edf3bitmapTb4b4b4)

Te6edf3notificationTff7b72.Td2a8ffsetSmallIconTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnotification_small_iconTb4b4b4)

T8b949e# large_icon_path = self.sideband.icon
T8b949e# bitmap_icon = BitmapFactory.decodeFile(large_icon_path)
T8b949e# notification.setLargeIcon(bitmap_icon)

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffnotification_intentTb4b4b4:
Te6edf3notification_intent Tff7b72= Te6edf3IntentTb4b4b4(Tff7b72selfTff7b72.Td2a8ffapp_contextTb4b4b4, Te6edf3python_actTb4b4b4)
Te6edf3notification_intentTff7b72.Td2a8ffsetFlagsTb4b4b4(Te6edf3IntentTff7b72.Td2a8ffFLAG_ACTIVITY_SINGLE_TOPTb4b4b4)
Te6edf3notification_intentTff7b72.Td2a8ffsetActionTb4b4b4(Te6edf3IntentTff7b72.Td2a8ffACTION_MAINTb4b4b4)
Te6edf3notification_intentTff7b72.Td2a8ffaddCategoryTb4b4b4(Te6edf3IntentTff7b72.Td2a8ffCATEGORY_LAUNCHERTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnotification_intent Tff7b72= Te6edf3PendingIntentTff7b72.Td2a8ffgetActivityTb4b4b4(Tff7b72selfTff7b72.Td2a8ffapp_contextTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3notification_intentTb4b4b4, T79c0ff0Tb4b4b4)

Te6edf3notificationTff7b72.Td2a8ffsetContentIntentTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnotification_intentTb4b4b4)
Te6edf3notificationTff7b72.Td2a8ffsetAutoCancelTb4b4b4(Tff7b72TrueTb4b4b4)

Te6edf3built_notification Tff7b72= Te6edf3notificationTff7b72.Td2a8ffbuildTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnotification_serviceTff7b72.Td2a8ffnotifyTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3built_notificationTb4b4b4)

Tff7b72def Td2a8ffcheck_permissionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3permissionTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3result Tff7b72= Tff7b72selfTff7b72.Td2a8ffandroid_serviceTff7b72.Td2a8ffcheckSelfPermissionTb4b4b4(Ta5d6ff"Ta5d6ffandroid.permission.Ta5d6ff"Tff7b72+Te6edf3permissionTb4b4b4)
Tff7b72if Te6edf3result Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Tff7b72True

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while checking permission: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False

Tff7b72def Td2a8ffbackground_location_allowedTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False

Te6edf3perms Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffACCESS_FINE_LOCATIONTa5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ffACCESS_COARSE_LOCATIONTa5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ffACCESS_BACKGROUND_LOCATIONTa5d6ff"Tb4b4b4]
Tff7b72for Te6edf3perm Tff7b72in Te6edf3permsTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffcheck_permissionTb4b4b4(Te6edf3permTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False

Tff7b72return Tff7b72True

Tff7b72def Td2a8ffandroid_location_callbackTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_raw_gps Tff7b72= Te6edf3kwargs
Tff7b72selfTff7b72.Td2a8ff_last_gps_update Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffshould_update_locationTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftelemetry_enabledTa5d6ff"Tb4b4b4] Tff7b72and Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftelemetry_s_locationTa5d6ff"Tb4b4b4] Tff7b72and Tff7b72selfTff7b72.Td2a8ffbackground_location_allowedTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False

Tff7b72def Td2a8ffupdate_location_providerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffshould_update_locationTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_gps_startedTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffStarting service location providerTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffgps Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72from T7ee787plyer Tff7b72import Te6edf3gps
Tff7b72selfTff7b72.Td2a8ffgps Tff7b72= Te6edf3gps

Tff7b72selfTff7b72.Td2a8ffgpsTff7b72.Td2a8ffconfigureTb4b4b4(Te6edf3on_locationTff7b72=Tff7b72selfTff7b72.Td2a8ffandroid_location_callbackTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffgpsTff7b72.Td2a8ffstartTb4b4b4(Te6edf3minTimeTff7b72=Tff7b72selfTff7b72.Td2a8ff_gps_stale_timeTb4b4b4, Te6edf3minDistanceTff7b72=Tff7b72selfTff7b72.Td2a8ff_gps_min_distanceTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_gps_started Tff7b72= Tff7b72True

Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_gps_startedTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffStopping service location providerTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffgps Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffgpsTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_gps_started Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_raw_gps Tff7b72= Tff7b72None

Tff7b72def Td2a8ffget_locationTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_last_gps_updateTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_raw_gps

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffargument Tff7b72= Te6edf3environTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff'Ta5d6ffPYTHON_SERVICE_ARGUMENTTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffapp_dir Tff7b72= Tff7b72selfTff7b72.Td2a8ffargument
Tff7b72selfTff7b72.Td2a8ffmulticast_lock Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffwake_lock Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffgps Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_gps_started Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_gps_stale_time Tff7b72= T79c0ff300Tff7b72-T79c0ff1
Tff7b72selfTff7b72.Td2a8ff_gps_min_distance Tff7b72= T79c0ff3
Tff7b72selfTff7b72.Td2a8ff_raw_gps Tff7b72= Tff7b72None

Tff7b72selfTff7b72.Td2a8ffandroid_service Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffapp_context Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffwifi_manager Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpower_manager Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffusb_devices Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffusb_device_filter Tff7b72= Te6edf3SidebandServiceTff7b72.Td2a8ffusb_device_filter

Tff7b72selfTff7b72.Td2a8ffnotification_service Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffnotification_channel Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffnotification_intent Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffnotification_small_icon Tff7b72= Tff7b72None

Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffandroid_service Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6fforg.kivy.android.PythonServiceTa5d6ff'Tb4b4b4)Tff7b72.Td2a8ffmService
Tff7b72selfTff7b72.Td2a8ffapp_context Tff7b72= Tff7b72selfTff7b72.Td2a8ffandroid_serviceTff7b72.Td2a8ffgetApplicationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffgetApplicationContextTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwifi_manager Tff7b72= Tff7b72selfTff7b72.Td2a8ffapp_contextTff7b72.Td2a8ffgetSystemServiceTb4b4b4(Te6edf3ContextTff7b72.Td2a8ffWIFI_SERVICETb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwifi_manager Tff7b72= Tff7b72None
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not acquire Android WiFi Manager! Keeping WiFi-based interfaces up will be unavailable.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpower_manager Tff7b72= Tff7b72selfTff7b72.Td2a8ffapp_contextTff7b72.Td2a8ffgetSystemServiceTb4b4b4(Te6edf3ContextTff7b72.Td2a8ffPOWER_SERVICETb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpower_manager Tff7b72= Tff7b72None
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not acquire Android Power Manager! Taking wakelocks and keeping the CPU running will be unavailable.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffdiscover_usb_devicesTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsideband Tff7b72= Te6edf3SidebandCoreTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3is_serviceTff7b72=Tff7b72TrueTb4b4b4, Te6edf3android_app_dirTff7b72=Tff7b72selfTff7b72.Td2a8ffapp_dirTb4b4b4, Te6edf3verboseTff7b72=Te6edf3__debug_build__Tb4b4b4, Te6edf3owner_serviceTff7b72=Tff7b72selfTb4b4b4, Te6edf3service_contextTff7b72=Tff7b72selfTff7b72.Td2a8ffandroid_serviceTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffdebugTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3LoggerTff7b72.Td2a8ffsetLevelTb4b4b4(Te6edf3LOG_LEVELSTb4b4b4[Ta5d6ff"Ta5d6ffdebugTa5d6ff"Tb4b4b4]Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffupdate_connectivity_typeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDiscovered USB devices: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffusb_devicesTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffupdate_location_providerTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8ffdiscover_usb_devicesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffusb_devices Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDiscovering attached USB devices...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3devices Tff7b72= Te6edf3usbTff7b72.Td2a8ffget_usb_device_listTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3device Tff7b72in Te6edf3devicesTb4b4b4:
Te6edf3device_entry Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffgetDeviceNameTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffvidTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffgetVendorIdTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffpidTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffgetProductIdTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmanufacturerTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffgetManufacturerNameTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffproductnameTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffgetProductNameTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72if Te6edf3device_entryTb4b4b4[Ta5d6ff"Ta5d6ffvidTa5d6ff"Tb4b4b4] Tff7b72in Tff7b72selfTff7b72.Td2a8ffusb_device_filterTb4b4b4:
Tff7b72if Te6edf3device_entryTb4b4b4[Ta5d6ff"Ta5d6ffpidTa5d6ff"Tb4b4b4] Tff7b72in Tff7b72selfTff7b72.Td2a8ffusb_device_filterTb4b4b4[Te6edf3device_entryTb4b4b4[Ta5d6ff"Ta5d6ffvidTa5d6ff"Tb4b4b4]Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffusb_devicesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3device_entryTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not list USB devices. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftake_locksTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False

Tff7b72def Td2a8fftake_locksTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3force_multicastTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffget_platformTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmulticast_lock Tff7b72== Tff7b72None Tff7b72or Te6edf3force_multicastTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffwifi_manager Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCreating multicast lockTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmulticast_lock Tff7b72= Tff7b72selfTff7b72.Td2a8ffwifi_managerTff7b72.Td2a8ffcreateMulticastLockTb4b4b4(Ta5d6ff"Ta5d6ffsideband_serviceTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffmulticast_lock Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffmulticast_lockTff7b72.Td2a8ffisHeldTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTaking multicast lockTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmulticast_lockTff7b72.Td2a8ffacquireTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffMulticast lock already heldTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffwake_lock Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpower_manager Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCreating wake lockTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwake_lock Tff7b72= Tff7b72selfTff7b72.Td2a8ffpower_managerTff7b72.Td2a8ffnewWakeLockTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpower_managerTff7b72.Td2a8ffPARTIAL_WAKE_LOCKTb4b4b4, Ta5d6ff"Ta5d6ffsideband_serviceTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffwake_lock Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffwake_lockTff7b72.Td2a8ffisHeldTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTaking wake lockTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwake_lockTff7b72.Td2a8ffacquireTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffWake lock already heldTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72def Td2a8ffrelease_locksTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffget_platformTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffmulticast_lock Tff7b72== Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ffmulticast_lockTff7b72.Td2a8ffisHeldTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReleasing multicast lockTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmulticast_lockTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffwake_lock Tff7b72== Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ffwake_lockTff7b72.Td2a8ffisHeldTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReleasing wake lockTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwake_lockTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffupdate_connectivity_typeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffreticulumTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3is_controlling Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Te6edf3is_controlling Tff7b72= Tff7b72True

Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffsetpersistentTb4b4b4(Ta5d6ff"Ta5d6ffservice.is_controlling_connectivityTa5d6ff"Tb4b4b4, Te6edf3is_controllingTb4b4b4)
Tff7b72def Td2a8ffget_connectivity_statusTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffreticulumTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff[size=22dp][b]Connectivity Status[/b][/size]Tffea00\nTffea00\nTa5d6ffSideband is connected via a shared Reticulum instance running on this system. Use the rnstatus utility to obtain full connectivity info.Ta5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3ws Tff7b72= Ta5d6ff"Ta5d6ffDisabledTa5d6ff"
Te6edf3ts Tff7b72= Ta5d6ff"Ta5d6ffDisabledTa5d6ff"
Te6edf3i2s Tff7b72= Ta5d6ff"Ta5d6ffDisabledTa5d6ff"

T8b949e# stat = "[size=22dp][b]Connectivity Status[/b][/size]\n\n"
Te6edf3stat Tff7b72= Ta5d6ff"Ta5d6ff"

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_local Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3netdevs Tff7b72= Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_localTff7b72.Td2a8ffadopted_interfaces
Tff7b72if Tffa657lenTb4b4b4(Te6edf3netdevsTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3ds Tff7b72= Ta5d6ff"Ta5d6ffUsing Ta5d6ff"
Tff7b72for Te6edf3netdev Tff7b72in Te6edf3netdevsTb4b4b4:
Te6edf3ds Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff[i]Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3netdevTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff[/i], Ta5d6ff"
Te6edf3ds Tff7b72= Te6edf3dsTb4b4b4[Tb4b4b4:Tff7b72-T79c0ff2Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3ds Tff7b72= Ta5d6ff"Ta5d6ffNo usable network devicesTa5d6ff"

Te6edf3np Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_localTff7b72.Td2a8ffpeersTb4b4b4)
Tff7b72if Te6edf3np Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3ws Tff7b72= Ta5d6ff"Ta5d6ff1 reachable peerTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3ws Tff7b72= Tffa657strTb4b4b4(Te6edf3npTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff reachable peersTa5d6ff"

Te6edf3stat Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff[b]Local[/b]Tffea00\nTffd700{ds}Tffea00\nTffd700{ws}Tffea00\nTffea00\nTa5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3dsTff7b72=Te6edf3dsTb4b4b4, Te6edf3wsTff7b72=Te6edf3wsTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_rnode Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_rnodeTff7b72.Td2a8ffonlineTb4b4b4:
Te6edf3rs Tff7b72= Ta5d6ff"Ta5d6ffOn-air at Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_rnodeTff7b72.Td2a8ffbitrate_kbpsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff KbpsTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3rs Tff7b72= Ta5d6ff"Ta5d6ffInterface DownTa5d6ff"

Te6edf3stat Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff[b]RNode[/b]Tffea00\nTffd700{rs}Tffea00\nTffea00\nTa5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3rsTff7b72=Te6edf3rsTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_modem Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_modemTff7b72.Td2a8ffonlineTb4b4b4:
Te6edf3rm Tff7b72= Ta5d6ff"Ta5d6ffConnectedTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3rm Tff7b72= Ta5d6ff"Ta5d6ffInterface DownTa5d6ff"

Te6edf3stat Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff[b]Radio Modem[/b]Tffea00\nTffd700{rm}Tffea00\nTffea00\nTa5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3rmTff7b72=Te6edf3rmTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_serial Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_serialTff7b72.Td2a8ffonlineTb4b4b4:
Te6edf3rs Tff7b72= Ta5d6ff"Ta5d6ffRunning at Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_serialTff7b72.Td2a8ffbitrateTff7b72/T79c0ff8Tb4b4b4, Te6edf3suffixTff7b72=Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3rs Tff7b72= Ta5d6ff"Ta5d6ffInterface DownTa5d6ff"

Te6edf3stat Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff[b]Serial Port[/b]Tffea00\nTffd700{rs}Tffea00\nTffea00\nTa5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3rsTff7b72=Te6edf3rsTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_tcp Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_tcpTff7b72.Td2a8ffonlineTb4b4b4:
Te6edf3ts Tff7b72= Ta5d6ff"Ta5d6ffConnected to Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_tcpTff7b72.Td2a8fftarget_ipTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_tcpTff7b72.Td2a8fftarget_portTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3ts Tff7b72= Ta5d6ff"Ta5d6ffInterface DownTa5d6ff"

Te6edf3stat Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff[b]TCP[/b]Tffea00\nTffd700{ts}Tffea00\nTffea00\nTa5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3tsTff7b72=Te6edf3tsTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_i2p Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3i2s Tff7b72= Ta5d6ff"Ta5d6ffUnknownTa5d6ff"
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_i2pTb4b4b4, Ta5d6ff"Ta5d6ffi2p_tunnel_stateTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_i2pTff7b72.Td2a8ffi2p_tunnel_state Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_i2pTff7b72.Td2a8ffi2p_tunnel_state Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffI2PInterfaceTff7b72.Td2a8ffI2PInterfacePeerTff7b72.Td2a8ffTUNNEL_STATE_INITTb4b4b4:
Te6edf3i2s Tff7b72= Ta5d6ff"Ta5d6ffTunnel ConnectingTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_i2pTff7b72.Td2a8ffi2p_tunnel_state Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffI2PInterfaceTff7b72.Td2a8ffI2PInterfacePeerTff7b72.Td2a8ffTUNNEL_STATE_ACTIVETb4b4b4:
Te6edf3i2s Tff7b72= Ta5d6ff"Ta5d6ffTunnel ActiveTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_i2pTff7b72.Td2a8ffi2p_tunnel_state Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffI2PInterfaceTff7b72.Td2a8ffI2PInterfacePeerTff7b72.Td2a8ffTUNNEL_STATE_STALETb4b4b4:
Te6edf3i2s Tff7b72= Ta5d6ff"Ta5d6ffTunnel UnresponsiveTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_i2pTff7b72.Td2a8ffonlineTb4b4b4:
Te6edf3i2s Tff7b72= Ta5d6ff"Ta5d6ffConnectedTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3i2s Tff7b72= Ta5d6ff"Ta5d6ffConnecting to I2PTa5d6ff"

Te6edf3stat Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff[b]I2P[/b]Tffea00\nTffd700{i2s}Tffea00\nTffea00\nTa5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3i2sTff7b72=Te6edf3i2sTb4b4b4)

Te6edf3total_rxb Tff7b72= T79c0ff0
Te6edf3total_txb Tff7b72= T79c0ff0

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_local Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3total_rxb Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_localTff7b72.Td2a8ffrxb
Te6edf3total_txb Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_localTff7b72.Td2a8fftxb
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_rnode Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3total_rxb Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_rnodeTff7b72.Td2a8ffrxb
Te6edf3total_txb Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_rnodeTff7b72.Td2a8fftxb
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_modem Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3total_rxb Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_modemTff7b72.Td2a8ffrxb
Te6edf3total_txb Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_modemTff7b72.Td2a8fftxb
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_serial Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3total_rxb Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_serialTff7b72.Td2a8ffrxb
Te6edf3total_txb Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_serialTff7b72.Td2a8fftxb
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_tcp Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3total_rxb Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_tcpTff7b72.Td2a8ffrxb
Te6edf3total_txb Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_tcpTff7b72.Td2a8fftxb
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_i2p Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3total_rxb Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_i2pTff7b72.Td2a8ffrxb
Te6edf3total_txb Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_i2pTff7b72.Td2a8fftxb

Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3stat Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff[b]Transport Instance[/b]Tffea00\nTa5d6ffRouting TrafficTffea00\nTffea00\nTa5d6ff"

Te6edf3stat Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff[b]Traffic[/b]Tffea00\nTa5d6ffIn: Tffd700{inb}Tffea00\nTa5d6ffOut: Tffd700{outb}Tffea00\nTffea00\nTa5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3inbTff7b72=Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3total_rxbTb4b4b4)Tb4b4b4, Te6edf3outbTff7b72=Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3total_txbTb4b4b4)Tb4b4b4)

Tff7b72if Te6edf3statTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Tffea00\nTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3stat Tff7b72= Te6edf3statTb4b4b4[Tb4b4b4:Tff7b72-T79c0ff2Tb4b4b4]

Tff7b72return Te6edf3stat

Tff7b72def Td2a8ffrunTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Te6edf3sleep_time Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffservice.heartbeatTa5d6ff"Tb4b4b4, Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffservice.connectivity_statusTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffget_connectivity_statusTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffgetstateTb4b4b4(Ta5d6ff"Ta5d6ffwants.service_stopTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffservice_stopped Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Te6edf3sleep_time Tff7b72= T79c0ff0

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffgetstateTb4b4b4(Ta5d6ff"Ta5d6ffwants.clear_notificationsTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffwants.clear_notificationsTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffnotification_service Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnotification_serviceTff7b72.Td2a8ffcancelAllTb4b4b4(Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffgetstateTb4b4b4(Ta5d6ff"Ta5d6ffwants.settings_reloadTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffwants.settings_reloadTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffreload_configurationTb4b4b4(Tb4b4b4)

Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3sleep_timeTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffcleanupTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrelease_locksTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffhandle_exceptionTb4b4b4(Te6edf3exc_typeTb4b4b4, Te6edf3exc_valueTb4b4b4, Te6edf3exc_tracebackTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657issubclassTb4b4b4(Te6edf3exc_typeTb4b4b4, Tf85149KeyboardInterruptTb4b4b4)Tb4b4b4:
Te6edf3sysTff7b72.Td2a8ff__excepthook__Tb4b4b4(Te6edf3exc_typeTb4b4b4, Te6edf3exc_valueTb4b4b4, Te6edf3exc_tracebackTb4b4b4)
Tff7b72return

Tff7b72if Te6edf3exc_type Tff7b72== Tf85149SystemExitTb4b4b4:
Te6edf3sysTff7b72.Td2a8ff__excepthook__Tb4b4b4(Te6edf3exc_typeTb4b4b4, Te6edf3exc_valueTb4b4b4, Te6edf3exc_tracebackTb4b4b4)
Tff7b72return

Tff7b72import T7ee787traceback
Te6edf3exc_text Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3tracebackTff7b72.Td2a8ffformat_exceptionTb4b4b4(Te6edf3exc_typeTb4b4b4, Te6edf3exc_valueTb4b4b4, Te6edf3exc_tracebackTb4b4b4)Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAn unhandled Tffd700{Tffa657strTb4b4b4(Te6edf3exc_typeTb4b4b4)Tffd700}Ta5d6ff exception occurred: Tffd700{Tffa657strTb4b4b4(Te6edf3exc_valueTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Te6edf3exc_textTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Te6edf3sysTff7b72.Td2a8ffexcepthook Tff7b72= Te6edf3handle_exception
Te6edf3SidebandServiceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────